<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/cgroup.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/cgroup.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX0NHUk9VUF9IXzA_"><span class="b">_LINUX_CGROUP_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX0NHUk9VUF9IXzA_"><span class="b">_LINUX_CGROUP_H</span></a>
<a name="3" /><span class="True">       3:</span> <span class="k">/*</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> *  cgroup interface</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *  Copyright (C) 2003 BULL SA</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> *  Copyright (C) 2004-2006 Silicon Graphics, Inc.</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> *</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> */</span>
<a name="10" /><span class="True">      10:</span> 
<a name="11" /><span class="True">      11:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">sched</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="12" /><span class="True">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cpumask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="True">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">nodemask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="True">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rcupdate</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="True">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rculist</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="True">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cgroupstats</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="True">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">prio_heap</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="True">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rwsem</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="True">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">idr</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="True">      20:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">workqueue</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="21" /><span class="True">      21:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">xattr</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="22" /><span class="True">      22:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">fs</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="23" /><span class="True">      23:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">percpu</span><span class="f">-</span><span class="b">refcount</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="24" /><span class="True">      24:</span> 
<a name="25" /><span class="True">      25:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX0NHUk9VUFNfMA__"><span class="b">CONFIG_CGROUPS</span></a>
<a name="26" /><span class="True">      26:</span> 
<a name="27" /><span class="True">      27:</span> <span class="m">struct</span> <span class="b">cgroupfs_root</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> <span class="m">struct</span> <span class="b">cgroup_subsys</span><span class="f">;</span>
<a name="29" /><span class="True">      29:</span> <span class="m">struct</span> <span class="b">inode</span><span class="f">;</span>
<a name="30" /><span class="True">      30:</span> <span class="m">struct</span> <span class="b">cgroup</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span> <span class="m">struct</span> <span class="b">css_id</span><span class="f">;</span>
<a name="32" /><span class="True">      32:</span> <span class="m">struct</span> <span class="b">eventfd_ctx</span><span class="f">;</span>
<a name="33" /><span class="True">      33:</span> 
<a name="34" /><span class="True">      34:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">cgroup_init_early</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">cgroup_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="36" /><span class="True">      36:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cgroup_fork</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span><span class="f">;</span>
<a name="37" /><span class="True">      37:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cgroup_post_fork</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span><span class="f">;</span>
<a name="38" /><span class="True">      38:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cgroup_exit</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">,</span> <span class="m">int</span> <span class="b">run_callbacks</span><span class="f">)</span><span class="f">;</span>
<a name="39" /><span class="True">      39:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">cgroupstats_build</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroupstats</span> <span class="f">*</span><span class="b">stats</span><span class="f">,</span>
<a name="40" /><span class="True">      40:</span>                 <span class="m">struct</span> <span class="b">dentry</span> <span class="f">*</span><span class="b">dentry</span><span class="f">)</span><span class="f">;</span>
<a name="41" /><span class="True">      41:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">cgroup_load_subsys</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">)</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">cgroup_unload_subsys</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">)</span><span class="f">;</span>
<a name="43" /><span class="True">      43:</span> 
<a name="44" /><span class="True">      44:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">proc_cgroup_show</span><span class="f">(</span><span class="m">struct</span> <span class="b">seq_file</span> <span class="f">*</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> 
<a name="46" /><span class="True">      46:</span> <span class="k">/*</span>
<a name="47" /><span class="True">      47:</span> <span class="k"> * Define the enumeration of all cgroup subsystems.</span>
<a name="48" /><span class="True">      48:</span> <span class="k"> *</span>
<a name="49" /><span class="True">      49:</span> <span class="k"> * We define ids for builtin subsystems and then modular ones.</span>
<a name="50" /><span class="True">      50:</span> <span class="k"> */</span>
<a name="51" /><span class="True">      51:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U1VCU1lTXzE_"><span class="b">SUBSYS</span></a><span class="f">(</span><span class="b">_x</span><span class="f">)</span> <span class="b">_x</span> <span class="f">##</span> <span class="b">_subsys_id</span><span class="f">,</span>
<a name="52" /><span class="True">      52:</span> <span class="m">enum</span> <span class="b">cgroup_subsys_id</span> <span class="f">{</span>
<a name="53" /><span class="True">      53:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_SVNfQlVJTFRJTl8w"><span class="b">IS_BUILTIN</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span>
<a name="54" /><span class="True">      54:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cgroup_subsys</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="55" /><span class="True">      55:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a>
<a name="56" /><span class="True">      56:</span>     <span class="b">CGROUP_BUILTIN_SUBSYS_COUNT</span><span class="f">,</span>
<a name="57" /><span class="True">      57:</span> 
<a name="58" /><span class="True">      58:</span>     <span class="b">__CGROUP_SUBSYS_TEMP_PLACEHOLDER</span> <span class="f">=</span> <span class="b">CGROUP_BUILTIN_SUBSYS_COUNT</span> <span class="f">-</span> <span class="c">1</span><span class="f">,</span>
<a name="59" /><span class="True">      59:</span> 
<a name="60" /><span class="True">      60:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_SVNfTU9EVUxFXzA_"><span class="b">IS_MODULE</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span>
<a name="61" /><span class="True">      61:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cgroup_subsys</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="62" /><span class="True">      62:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a>
<a name="63" /><span class="True">      63:</span>     <span class="b">CGROUP_SUBSYS_COUNT</span><span class="f">,</span>
<a name="64" /><span class="True">      64:</span> <span class="f">}</span><span class="f">;</span>
<a name="65" /><span class="True">      65:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_U1VCU1lTXzE_"><span class="b">SUBSYS</span></a>
<a name="66" /><span class="True">      66:</span> 
<a name="67" /><span class="True">      67:</span> <span class="k">/* Per-subsystem/per-cgroup state maintained by the system. */</span>
<a name="68" /><span class="True">      68:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">{</span>
<a name="69" /><span class="True">      69:</span>     <span class="k">/* the cgroup that this css is attached to */</span>
<a name="70" /><span class="True">      70:</span>     <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgroup</span><span class="f">;</span>
<a name="71" /><span class="True">      71:</span> 
<a name="72" /><span class="True">      72:</span>     <span class="k">/* the cgroup subsystem that this css is attached to */</span>
<a name="73" /><span class="True">      73:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">;</span>
<a name="74" /><span class="True">      74:</span> 
<a name="75" /><span class="True">      75:</span>     <span class="k">/* reference count - access via css_[try]get() and css_put() */</span>
<a name="76" /><span class="True">      76:</span>     <span class="m">struct</span> <span class="b">percpu_ref</span> <span class="b">refcnt</span><span class="f">;</span>
<a name="77" /><span class="True">      77:</span> 
<a name="78" /><span class="True">      78:</span>     <span class="k">/* the parent css */</span>
<a name="79" /><span class="True">      79:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">parent</span><span class="f">;</span>
<a name="80" /><span class="True">      80:</span> 
<a name="81" /><span class="True">      81:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="82" /><span class="True">      82:</span>     <span class="k">/* ID for this css, if possible */</span>
<a name="83" /><span class="True">      83:</span>     <span class="m">struct</span> <span class="b">css_id</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">id</span><span class="f">;</span>
<a name="84" /><span class="True">      84:</span> 
<a name="85" /><span class="True">      85:</span>     <span class="k">/* percpu_ref killing and RCU release */</span>
<a name="86" /><span class="True">      86:</span>     <span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a><span class="f">;</span>
<a name="87" /><span class="True">      87:</span>     <span class="m">struct</span> <span class="b">work_struct</span> <span class="b">destroy_work</span><span class="f">;</span>
<a name="88" /><span class="True">      88:</span> <span class="f">}</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> 
<a name="90" /><span class="True">      90:</span> <span class="k">/* bits in struct cgroup_subsys_state flags field */</span>
<a name="91" /><span class="True">      91:</span> <span class="m">enum</span> <span class="f">{</span>
<a name="92" /><span class="True">      92:</span>     <span class="b">CSS_ROOT</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">,</span> <span class="k">/* this CSS is the root of the subsystem */</span>
<a name="93" /><span class="True">      93:</span>     <span class="b">CSS_ONLINE</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">1</span><span class="f">)</span><span class="f">,</span> <span class="k">/* between -&gt;css_online() and -&gt;css_offline() */</span>
<a name="94" /><span class="True">      94:</span> <span class="f">}</span><span class="f">;</span>
<a name="95" /><span class="True">      95:</span> 
<a name="96" /><span class="True">      96:</span> <span class="k">/**</span>
<a name="97" /><span class="True">      97:</span> <span class="k"> * css_get - obtain a reference on the specified css</span>
<a name="98" /><span class="True">      98:</span> <span class="k"> * @css: target css</span>
<a name="99" /><span class="True">      99:</span> <span class="k"> *</span>
<a name="100" /><span class="True">     100:</span> <span class="k"> * The caller must already have a reference.</span>
<a name="101" /><span class="True">     101:</span> <span class="k"> */</span>
<a name="102" /><span class="True">     102:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">css_get</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span>
<a name="103" /><span class="True">     103:</span> <span class="f">{</span>
<a name="104" /><span class="True">     104:</span>     <span class="k">/* We don&apos;t need to reference count the root state */</span>
<a name="105" /><span class="True">     105:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="f">(</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">flags</span> <span class="f">&amp;</span> <span class="b">CSS_ROOT</span><span class="f">)</span><span class="f">)</span>
<a name="106" /><span class="True">     106:</span>         <span class="b">percpu_ref_get</span><span class="f">(</span><span class="f">&amp;</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">refcnt</span><span class="f">)</span><span class="f">;</span>
<a name="107" /><span class="True">     107:</span> <span class="f">}</span>
<a name="108" /><span class="True">     108:</span> 
<a name="109" /><span class="True">     109:</span> <span class="k">/**</span>
<a name="110" /><span class="True">     110:</span> <span class="k"> * css_tryget - try to obtain a reference on the specified css</span>
<a name="111" /><span class="True">     111:</span> <span class="k"> * @css: target css</span>
<a name="112" /><span class="True">     112:</span> <span class="k"> *</span>
<a name="113" /><span class="True">     113:</span> <span class="k"> * Obtain a reference on @css if it&apos;s alive.  The caller naturally needs to</span>
<a name="114" /><span class="True">     114:</span> <span class="k"> * ensure that @css is accessible but doesn&apos;t have to be holding a</span>
<a name="115" /><span class="True">     115:</span> <span class="k"> * reference on it - IOW, RCU protected access is good enough for this</span>
<a name="116" /><span class="True">     116:</span> <span class="k"> * function.  Returns %true if a reference count was successfully obtained;</span>
<a name="117" /><span class="True">     117:</span> <span class="k"> * %false otherwise.</span>
<a name="118" /><span class="True">     118:</span> <span class="k"> */</span>
<a name="119" /><span class="True">     119:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">css_tryget</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span>
<a name="120" /><span class="True">     120:</span> <span class="f">{</span>
<a name="121" /><span class="True">     121:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">flags</span> <span class="f">&amp;</span> <span class="b">CSS_ROOT</span><span class="f">)</span>
<a name="122" /><span class="True">     122:</span>         <span class="m">return</span> <span class="m">true</span><span class="f">;</span>
<a name="123" /><span class="True">     123:</span>     <span class="m">return</span> <span class="b">percpu_ref_tryget</span><span class="f">(</span><span class="f">&amp;</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">refcnt</span><span class="f">)</span><span class="f">;</span>
<a name="124" /><span class="True">     124:</span> <span class="f">}</span>
<a name="125" /><span class="True">     125:</span> 
<a name="126" /><span class="True">     126:</span> <span class="k">/**</span>
<a name="127" /><span class="True">     127:</span> <span class="k"> * css_put - put a css reference</span>
<a name="128" /><span class="True">     128:</span> <span class="k"> * @css: target css</span>
<a name="129" /><span class="True">     129:</span> <span class="k"> *</span>
<a name="130" /><span class="True">     130:</span> <span class="k"> * Put a reference obtained via css_get() and css_tryget().</span>
<a name="131" /><span class="True">     131:</span> <span class="k"> */</span>
<a name="132" /><span class="True">     132:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">css_put</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span>
<a name="133" /><span class="True">     133:</span> <span class="f">{</span>
<a name="134" /><span class="True">     134:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="f">(</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">flags</span> <span class="f">&amp;</span> <span class="b">CSS_ROOT</span><span class="f">)</span><span class="f">)</span>
<a name="135" /><span class="True">     135:</span>         <span class="b">percpu_ref_put</span><span class="f">(</span><span class="f">&amp;</span><span class="b">css</span><span class="f">-&gt;</span><span class="b">refcnt</span><span class="f">)</span><span class="f">;</span>
<a name="136" /><span class="True">     136:</span> <span class="f">}</span>
<a name="137" /><span class="True">     137:</span> 
<a name="138" /><span class="True">     138:</span> <span class="k">/* bits in struct cgroup flags field */</span>
<a name="139" /><span class="True">     139:</span> <span class="m">enum</span> <span class="f">{</span>
<a name="140" /><span class="True">     140:</span>     <span class="k">/* Control Group is dead */</span>
<a name="141" /><span class="True">     141:</span>     <span class="b">CGRP_DEAD</span><span class="f">,</span>
<a name="142" /><span class="True">     142:</span>     <span class="k">/*</span>
<a name="143" /><span class="True">     143:</span> <span class="k">     * Control Group has previously had a child cgroup or a task,</span>
<a name="144" /><span class="True">     144:</span> <span class="k">     * but no longer (only if CGRP_NOTIFY_ON_RELEASE is set)</span>
<a name="145" /><span class="True">     145:</span> <span class="k">     */</span>
<a name="146" /><span class="True">     146:</span>     <span class="b">CGRP_RELEASABLE</span><span class="f">,</span>
<a name="147" /><span class="True">     147:</span>     <span class="k">/* Control Group requires release notifications to userspace */</span>
<a name="148" /><span class="True">     148:</span>     <span class="b">CGRP_NOTIFY_ON_RELEASE</span><span class="f">,</span>
<a name="149" /><span class="True">     149:</span>     <span class="k">/*</span>
<a name="150" /><span class="True">     150:</span> <span class="k">     * Clone the parent&apos;s configuration when creating a new child</span>
<a name="151" /><span class="True">     151:</span> <span class="k">     * cpuset cgroup.  For historical reasons, this option can be</span>
<a name="152" /><span class="True">     152:</span> <span class="k">     * specified at mount time and thus is implemented here.</span>
<a name="153" /><span class="True">     153:</span> <span class="k">     */</span>
<a name="154" /><span class="True">     154:</span>     <span class="b">CGRP_CPUSET_CLONE_CHILDREN</span><span class="f">,</span>
<a name="155" /><span class="True">     155:</span>     <span class="k">/* see the comment above CGRP_ROOT_SANE_BEHAVIOR for details */</span>
<a name="156" /><span class="True">     156:</span>     <span class="b">CGRP_SANE_BEHAVIOR</span><span class="f">,</span>
<a name="157" /><span class="True">     157:</span> <span class="f">}</span><span class="f">;</span>
<a name="158" /><span class="True">     158:</span> 
<a name="159" /><span class="True">     159:</span> <span class="m">struct</span> <span class="b">cgroup_name</span> <span class="f">{</span>
<a name="160" /><span class="True">     160:</span>     <span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a><span class="f">;</span>
<a name="161" /><span class="True">     161:</span>     <span class="m">char</span> <span class="b">name</span><span class="f">[</span><span class="f">]</span><span class="f">;</span>
<a name="162" /><span class="True">     162:</span> <span class="f">}</span><span class="f">;</span>
<a name="163" /><span class="True">     163:</span> 
<a name="164" /><span class="True">     164:</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">{</span>
<a name="165" /><span class="True">     165:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>        <span class="k">/* &quot;unsigned long&quot; so bitops work */</span>
<a name="166" /><span class="True">     166:</span> 
<a name="167" /><span class="True">     167:</span>     <span class="k">/*</span>
<a name="168" /><span class="True">     168:</span> <span class="k">     * idr allocated in-hierarchy ID.</span>
<a name="169" /><span class="True">     169:</span> <span class="k">     *</span>
<a name="170" /><span class="True">     170:</span> <span class="k">     * The ID of the root cgroup is always 0, and a new cgroup</span>
<a name="171" /><span class="True">     171:</span> <span class="k">     * will be assigned with a smallest available ID.</span>
<a name="172" /><span class="True">     172:</span> <span class="k">     */</span>
<a name="173" /><span class="True">     173:</span>     <span class="m">int</span> <span class="b">id</span><span class="f">;</span>
<a name="174" /><span class="True">     174:</span> 
<a name="175" /><span class="True">     175:</span>     <span class="k">/* the number of attached css&apos;s */</span>
<a name="176" /><span class="True">     176:</span>     <span class="m">int</span> <span class="b">nr_css</span><span class="f">;</span>
<a name="177" /><span class="True">     177:</span> 
<a name="178" /><span class="True">     178:</span>     <span class="k">/*</span>
<a name="179" /><span class="True">     179:</span> <span class="k">     * We link our &apos;sibling&apos; struct into our parent&apos;s &apos;children&apos;.</span>
<a name="180" /><span class="True">     180:</span> <span class="k">     * Our children link their &apos;sibling&apos; into our &apos;children&apos;.</span>
<a name="181" /><span class="True">     181:</span> <span class="k">     */</span>
<a name="182" /><span class="True">     182:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">sibling</span><span class="f">;</span>    <span class="k">/* my parent&apos;s children */</span>
<a name="183" /><span class="True">     183:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">children</span><span class="f">;</span>    <span class="k">/* my children */</span>
<a name="184" /><span class="True">     184:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">files</span><span class="f">;</span>        <span class="k">/* my files */</span>
<a name="185" /><span class="True">     185:</span> 
<a name="186" /><span class="True">     186:</span>     <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">parent</span><span class="f">;</span>        <span class="k">/* my parent */</span>
<a name="187" /><span class="True">     187:</span>     <span class="m">struct</span> <span class="b">dentry</span> <span class="f">*</span><span class="b">dentry</span><span class="f">;</span>        <span class="k">/* cgroup fs entry, RCU protected */</span>
<a name="188" /><span class="True">     188:</span> 
<a name="189" /><span class="True">     189:</span>     <span class="k">/*</span>
<a name="190" /><span class="True">     190:</span> <span class="k">     * Monotonically increasing unique serial number which defines a</span>
<a name="191" /><span class="True">     191:</span> <span class="k">     * uniform order among all cgroups.  It&apos;s guaranteed that all</span>
<a name="192" /><span class="True">     192:</span> <span class="k">     * -&gt;children lists are in the ascending order of -&gt;serial_nr.</span>
<a name="193" /><span class="True">     193:</span> <span class="k">     * It&apos;s used to allow interrupting and resuming iterations.</span>
<a name="194" /><span class="True">     194:</span> <span class="k">     */</span>
<a name="195" /><span class="True">     195:</span>     <span class="b">u64</span> <span class="b">serial_nr</span><span class="f">;</span>
<a name="196" /><span class="True">     196:</span> 
<a name="197" /><span class="True">     197:</span>     <span class="k">/*</span>
<a name="198" /><span class="True">     198:</span> <span class="k">     * This is a copy of dentry-&gt;d_name, and it&apos;s needed because</span>
<a name="199" /><span class="True">     199:</span> <span class="k">     * we can&apos;t use dentry-&gt;d_name in cgroup_path().</span>
<a name="200" /><span class="True">     200:</span> <span class="k">     *</span>
<a name="201" /><span class="True">     201:</span> <span class="k">     * You must acquire rcu_read_lock() to access cgrp-&gt;name, and</span>
<a name="202" /><span class="True">     202:</span> <span class="k">     * the only place that can change it is rename(), which is</span>
<a name="203" /><span class="True">     203:</span> <span class="k">     * protected by parent dir&apos;s i_mutex.</span>
<a name="204" /><span class="True">     204:</span> <span class="k">     *</span>
<a name="205" /><span class="True">     205:</span> <span class="k">     * Normally you should use cgroup_name() wrapper rather than</span>
<a name="206" /><span class="True">     206:</span> <span class="k">     * access it directly.</span>
<a name="207" /><span class="True">     207:</span> <span class="k">     */</span>
<a name="208" /><span class="True">     208:</span>     <span class="m">struct</span> <span class="b">cgroup_name</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">name</span><span class="f">;</span>
<a name="209" /><span class="True">     209:</span> 
<a name="210" /><span class="True">     210:</span>     <span class="k">/* Private pointers for each registered subsystem */</span>
<a name="211" /><span class="True">     211:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <a href="cpu.c_macros_ref.html#_X19yY3VfMA__"><span class="b">__rcu</span></a> <span class="f">*</span><span class="b">subsys</span><span class="f">[</span><span class="b">CGROUP_SUBSYS_COUNT</span><span class="f">]</span><span class="f">;</span>
<a name="212" /><span class="True">     212:</span> 
<a name="213" /><span class="True">     213:</span>     <span class="m">struct</span> <span class="b">cgroupfs_root</span> <span class="f">*</span><span class="b">root</span><span class="f">;</span>
<a name="214" /><span class="True">     214:</span> 
<a name="215" /><span class="True">     215:</span>     <span class="k">/*</span>
<a name="216" /><span class="True">     216:</span> <span class="k">     * List of cgrp_cset_links pointing at css_sets with tasks in this</span>
<a name="217" /><span class="True">     217:</span> <span class="k">     * cgroup.  Protected by css_set_lock.</span>
<a name="218" /><span class="True">     218:</span> <span class="k">     */</span>
<a name="219" /><span class="True">     219:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">cset_links</span><span class="f">;</span>
<a name="220" /><span class="True">     220:</span> 
<a name="221" /><span class="True">     221:</span>     <span class="k">/*</span>
<a name="222" /><span class="True">     222:</span> <span class="k">     * Linked list running through all cgroups that can</span>
<a name="223" /><span class="True">     223:</span> <span class="k">     * potentially be reaped by the release agent. Protected by</span>
<a name="224" /><span class="True">     224:</span> <span class="k">     * release_list_lock</span>
<a name="225" /><span class="True">     225:</span> <span class="k">     */</span>
<a name="226" /><span class="True">     226:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">release_list</span><span class="f">;</span>
<a name="227" /><span class="True">     227:</span> 
<a name="228" /><span class="True">     228:</span>     <span class="k">/*</span>
<a name="229" /><span class="True">     229:</span> <span class="k">     * list of pidlists, up to two for each namespace (one for procs, one</span>
<a name="230" /><span class="True">     230:</span> <span class="k">     * for tasks); created on demand.</span>
<a name="231" /><span class="True">     231:</span> <span class="k">     */</span>
<a name="232" /><span class="True">     232:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">pidlists</span><span class="f">;</span>
<a name="233" /><span class="True">     233:</span>     <span class="m">struct</span> <span class="b">mutex</span> <span class="b">pidlist_mutex</span><span class="f">;</span>
<a name="234" /><span class="True">     234:</span> 
<a name="235" /><span class="True">     235:</span>     <span class="k">/* dummy css with NULL -&gt;ss, points back to this cgroup */</span>
<a name="236" /><span class="True">     236:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="b">dummy_css</span><span class="f">;</span>
<a name="237" /><span class="True">     237:</span> 
<a name="238" /><span class="True">     238:</span>     <span class="k">/* For css percpu_ref killing and RCU-protected deletion */</span>
<a name="239" /><span class="True">     239:</span>     <span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a><span class="f">;</span>
<a name="240" /><span class="True">     240:</span>     <span class="m">struct</span> <span class="b">work_struct</span> <span class="b">destroy_work</span><span class="f">;</span>
<a name="241" /><span class="True">     241:</span> 
<a name="242" /><span class="True">     242:</span>     <span class="k">/* List of events which userspace want to receive */</span>
<a name="243" /><span class="True">     243:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">event_list</span><span class="f">;</span>
<a name="244" /><span class="True">     244:</span>     <span class="b">spinlock_t</span> <span class="b">event_list_lock</span><span class="f">;</span>
<a name="245" /><span class="True">     245:</span> 
<a name="246" /><span class="True">     246:</span>     <span class="k">/* directory xattrs */</span>
<a name="247" /><span class="True">     247:</span>     <span class="m">struct</span> <span class="b">simple_xattrs</span> <span class="b">xattrs</span><span class="f">;</span>
<a name="248" /><span class="True">     248:</span> <span class="f">}</span><span class="f">;</span>
<a name="249" /><span class="True">     249:</span> 
<a name="250" /><span class="True">     250:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX0NHUk9VUF9ST09UX05BTUVMRU5fMA__"><span class="b">MAX_CGROUP_ROOT_NAMELEN</span></a> <span class="c">64</span>
<a name="251" /><span class="True">     251:</span> 
<a name="252" /><span class="True">     252:</span> <span class="k">/* cgroupfs_root-&gt;flags */</span>
<a name="253" /><span class="True">     253:</span> <span class="m">enum</span> <span class="f">{</span>
<a name="254" /><span class="True">     254:</span>     <span class="k">/*</span>
<a name="255" /><span class="True">     255:</span> <span class="k">     * Unfortunately, cgroup core and various controllers are riddled</span>
<a name="256" /><span class="True">     256:</span> <span class="k">     * with idiosyncrasies and pointless options.  The following flag,</span>
<a name="257" /><span class="True">     257:</span> <span class="k">     * when set, will force sane behavior - some options are forced on,</span>
<a name="258" /><span class="True">     258:</span> <span class="k">     * others are disallowed, and some controllers will change their</span>
<a name="259" /><span class="True">     259:</span> <span class="k">     * hierarchical or other behaviors.</span>
<a name="260" /><span class="True">     260:</span> <span class="k">     *</span>
<a name="261" /><span class="True">     261:</span> <span class="k">     * The set of behaviors affected by this flag are still being</span>
<a name="262" /><span class="True">     262:</span> <span class="k">     * determined and developed and the mount option for this flag is</span>
<a name="263" /><span class="True">     263:</span> <span class="k">     * prefixed with __DEVEL__.  The prefix will be dropped once we</span>
<a name="264" /><span class="True">     264:</span> <span class="k">     * reach the point where all behaviors are compatible with the</span>
<a name="265" /><span class="True">     265:</span> <span class="k">     * planned unified hierarchy, which will automatically turn on this</span>
<a name="266" /><span class="True">     266:</span> <span class="k">     * flag.</span>
<a name="267" /><span class="True">     267:</span> <span class="k">     *</span>
<a name="268" /><span class="True">     268:</span> <span class="k">     * The followings are the behaviors currently affected this flag.</span>
<a name="269" /><span class="True">     269:</span> <span class="k">     *</span>
<a name="270" /><span class="True">     270:</span> <span class="k">     * - Mount options &quot;noprefix&quot; and &quot;clone_children&quot; are disallowed.</span>
<a name="271" /><span class="True">     271:</span> <span class="k">     *   Also, cgroupfs file cgroup.clone_children is not created.</span>
<a name="272" /><span class="True">     272:</span> <span class="k">     *</span>
<a name="273" /><span class="True">     273:</span> <span class="k">     * - When mounting an existing superblock, mount options should</span>
<a name="274" /><span class="True">     274:</span> <span class="k">     *   match.</span>
<a name="275" /><span class="True">     275:</span> <span class="k">     *</span>
<a name="276" /><span class="True">     276:</span> <span class="k">     * - Remount is disallowed.</span>
<a name="277" /><span class="True">     277:</span> <span class="k">     *</span>
<a name="278" /><span class="True">     278:</span> <span class="k">     * - rename(2) is disallowed.</span>
<a name="279" /><span class="True">     279:</span> <span class="k">     *</span>
<a name="280" /><span class="True">     280:</span> <span class="k">     * - &quot;tasks&quot; is removed.  Everything should be at process</span>
<a name="281" /><span class="True">     281:</span> <span class="k">     *   granularity.  Use &quot;cgroup.procs&quot; instead.</span>
<a name="282" /><span class="True">     282:</span> <span class="k">     *</span>
<a name="283" /><span class="True">     283:</span> <span class="k">     * - &quot;release_agent&quot; and &quot;notify_on_release&quot; are removed.</span>
<a name="284" /><span class="True">     284:</span> <span class="k">     *   Replacement notification mechanism will be implemented.</span>
<a name="285" /><span class="True">     285:</span> <span class="k">     *</span>
<a name="286" /><span class="True">     286:</span> <span class="k">     * - cpuset: tasks will be kept in empty cpusets when hotplug happens</span>
<a name="287" /><span class="True">     287:</span> <span class="k">     *   and take masks of ancestors with non-empty cpus/mems, instead of</span>
<a name="288" /><span class="True">     288:</span> <span class="k">     *   being moved to an ancestor.</span>
<a name="289" /><span class="True">     289:</span> <span class="k">     *</span>
<a name="290" /><span class="True">     290:</span> <span class="k">     * - cpuset: a task can be moved into an empty cpuset, and again it</span>
<a name="291" /><span class="True">     291:</span> <span class="k">     *   takes masks of ancestors.</span>
<a name="292" /><span class="True">     292:</span> <span class="k">     *</span>
<a name="293" /><span class="True">     293:</span> <span class="k">     * - memcg: use_hierarchy is on by default and the cgroup file for</span>
<a name="294" /><span class="True">     294:</span> <span class="k">     *   the flag is not created.</span>
<a name="295" /><span class="True">     295:</span> <span class="k">     *</span>
<a name="296" /><span class="True">     296:</span> <span class="k">     * - blkcg: blk-throttle becomes properly hierarchical.</span>
<a name="297" /><span class="True">     297:</span> <span class="k">     */</span>
<a name="298" /><span class="True">     298:</span>     <span class="b">CGRP_ROOT_SANE_BEHAVIOR</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">,</span>
<a name="299" /><span class="True">     299:</span> 
<a name="300" /><span class="True">     300:</span>     <span class="b">CGRP_ROOT_NOPREFIX</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">1</span><span class="f">)</span><span class="f">,</span> <span class="k">/* mounted subsystems have no named prefix */</span>
<a name="301" /><span class="True">     301:</span>     <span class="b">CGRP_ROOT_XATTR</span>        <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">2</span><span class="f">)</span><span class="f">,</span> <span class="k">/* supports extended attributes */</span>
<a name="302" /><span class="True">     302:</span> 
<a name="303" /><span class="True">     303:</span>     <span class="k">/* mount options live below bit 16 */</span>
<a name="304" /><span class="True">     304:</span>     <span class="b">CGRP_ROOT_OPTION_MASK</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">16</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">,</span>
<a name="305" /><span class="True">     305:</span> 
<a name="306" /><span class="True">     306:</span>     <span class="b">CGRP_ROOT_SUBSYS_BOUND</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">16</span><span class="f">)</span><span class="f">,</span> <span class="k">/* subsystems finished binding */</span>
<a name="307" /><span class="True">     307:</span> <span class="f">}</span><span class="f">;</span>
<a name="308" /><span class="True">     308:</span> 
<a name="309" /><span class="True">     309:</span> <span class="k">/*</span>
<a name="310" /><span class="True">     310:</span> <span class="k"> * A cgroupfs_root represents the root of a cgroup hierarchy, and may be</span>
<a name="311" /><span class="True">     311:</span> <span class="k"> * associated with a superblock to form an active hierarchy.  This is</span>
<a name="312" /><span class="True">     312:</span> <span class="k"> * internal to cgroup core.  Don&apos;t access directly from controllers.</span>
<a name="313" /><span class="True">     313:</span> <span class="k"> */</span>
<a name="314" /><span class="True">     314:</span> <span class="m">struct</span> <span class="b">cgroupfs_root</span> <span class="f">{</span>
<a name="315" /><span class="True">     315:</span>     <span class="m">struct</span> <span class="b">super_block</span> <span class="f">*</span><span class="b">sb</span><span class="f">;</span>
<a name="316" /><span class="True">     316:</span> 
<a name="317" /><span class="True">     317:</span>     <span class="k">/* The bitmask of subsystems attached to this hierarchy */</span>
<a name="318" /><span class="True">     318:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">subsys_mask</span><span class="f">;</span>
<a name="319" /><span class="True">     319:</span> 
<a name="320" /><span class="True">     320:</span>     <span class="k">/* Unique id for this hierarchy. */</span>
<a name="321" /><span class="True">     321:</span>     <span class="m">int</span> <span class="b">hierarchy_id</span><span class="f">;</span>
<a name="322" /><span class="True">     322:</span> 
<a name="323" /><span class="True">     323:</span>     <span class="k">/* A list running through the attached subsystems */</span>
<a name="324" /><span class="True">     324:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">subsys_list</span><span class="f">;</span>
<a name="325" /><span class="True">     325:</span> 
<a name="326" /><span class="True">     326:</span>     <span class="k">/* The root cgroup for this hierarchy */</span>
<a name="327" /><span class="True">     327:</span>     <span class="m">struct</span> <span class="b">cgroup</span> <span class="b">top_cgroup</span><span class="f">;</span>
<a name="328" /><span class="True">     328:</span> 
<a name="329" /><span class="True">     329:</span>     <span class="k">/* Tracks how many cgroups are currently defined in hierarchy.*/</span>
<a name="330" /><span class="True">     330:</span>     <span class="m">int</span> <span class="b">number_of_cgroups</span><span class="f">;</span>
<a name="331" /><span class="True">     331:</span> 
<a name="332" /><span class="True">     332:</span>     <span class="k">/* A list running through the active hierarchies */</span>
<a name="333" /><span class="True">     333:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">root_list</span><span class="f">;</span>
<a name="334" /><span class="True">     334:</span> 
<a name="335" /><span class="True">     335:</span>     <span class="k">/* Hierarchy-specific flags */</span>
<a name="336" /><span class="True">     336:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="337" /><span class="True">     337:</span> 
<a name="338" /><span class="True">     338:</span>     <span class="k">/* IDs for cgroups in this hierarchy */</span>
<a name="339" /><span class="True">     339:</span>     <span class="m">struct</span> <span class="b">idr</span> <span class="b">cgroup_idr</span><span class="f">;</span>
<a name="340" /><span class="True">     340:</span> 
<a name="341" /><span class="True">     341:</span>     <span class="k">/* The path to use for release notifications. */</span>
<a name="342" /><span class="True">     342:</span>     <span class="m">char</span> <span class="b">release_agent_path</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_UEFUSF9NQVhfMA__"><span class="b">PATH_MAX</span></a><span class="f">]</span><span class="f">;</span>
<a name="343" /><span class="True">     343:</span> 
<a name="344" /><span class="True">     344:</span>     <span class="k">/* The name for this hierarchy - may be empty */</span>
<a name="345" /><span class="True">     345:</span>     <span class="m">char</span> <span class="b">name</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX0NHUk9VUF9ST09UX05BTUVMRU5fMA__"><span class="b">MAX_CGROUP_ROOT_NAMELEN</span></a><span class="f">]</span><span class="f">;</span>
<a name="346" /><span class="True">     346:</span> <span class="f">}</span><span class="f">;</span>
<a name="347" /><span class="True">     347:</span> 
<a name="348" /><span class="True">     348:</span> <span class="k">/*</span>
<a name="349" /><span class="True">     349:</span> <span class="k"> * A css_set is a structure holding pointers to a set of</span>
<a name="350" /><span class="True">     350:</span> <span class="k"> * cgroup_subsys_state objects. This saves space in the task struct</span>
<a name="351" /><span class="True">     351:</span> <span class="k"> * object and speeds up fork()/exit(), since a single inc/dec and a</span>
<a name="352" /><span class="True">     352:</span> <span class="k"> * list_add()/del() can bump the reference count on the entire cgroup</span>
<a name="353" /><span class="True">     353:</span> <span class="k"> * set for a task.</span>
<a name="354" /><span class="True">     354:</span> <span class="k"> */</span>
<a name="355" /><span class="True">     355:</span> 
<a name="356" /><span class="True">     356:</span> <span class="m">struct</span> <span class="b">css_set</span> <span class="f">{</span>
<a name="357" /><span class="True">     357:</span> 
<a name="358" /><span class="True">     358:</span>     <span class="k">/* Reference count */</span>
<a name="359" /><span class="True">     359:</span>     <span class="b">atomic_t</span> <span class="b">refcount</span><span class="f">;</span>
<a name="360" /><span class="True">     360:</span> 
<a name="361" /><span class="True">     361:</span>     <span class="k">/*</span>
<a name="362" /><span class="True">     362:</span> <span class="k">     * List running through all cgroup groups in the same hash</span>
<a name="363" /><span class="True">     363:</span> <span class="k">     * slot. Protected by css_set_lock</span>
<a name="364" /><span class="True">     364:</span> <span class="k">     */</span>
<a name="365" /><span class="True">     365:</span>     <span class="m">struct</span> <span class="b">hlist_node</span> <span class="b">hlist</span><span class="f">;</span>
<a name="366" /><span class="True">     366:</span> 
<a name="367" /><span class="True">     367:</span>     <span class="k">/*</span>
<a name="368" /><span class="True">     368:</span> <span class="k">     * List running through all tasks using this cgroup</span>
<a name="369" /><span class="True">     369:</span> <span class="k">     * group. Protected by css_set_lock</span>
<a name="370" /><span class="True">     370:</span> <span class="k">     */</span>
<a name="371" /><span class="True">     371:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">tasks</span><span class="f">;</span>
<a name="372" /><span class="True">     372:</span> 
<a name="373" /><span class="True">     373:</span>     <span class="k">/*</span>
<a name="374" /><span class="True">     374:</span> <span class="k">     * List of cgrp_cset_links pointing at cgroups referenced from this</span>
<a name="375" /><span class="True">     375:</span> <span class="k">     * css_set.  Protected by css_set_lock.</span>
<a name="376" /><span class="True">     376:</span> <span class="k">     */</span>
<a name="377" /><span class="True">     377:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">cgrp_links</span><span class="f">;</span>
<a name="378" /><span class="True">     378:</span> 
<a name="379" /><span class="True">     379:</span>     <span class="k">/*</span>
<a name="380" /><span class="True">     380:</span> <span class="k">     * Set of subsystem states, one for each subsystem. This array</span>
<a name="381" /><span class="True">     381:</span> <span class="k">     * is immutable after creation apart from the init_css_set</span>
<a name="382" /><span class="True">     382:</span> <span class="k">     * during subsystem registration (at boot time) and modular subsystem</span>
<a name="383" /><span class="True">     383:</span> <span class="k">     * loading/unloading.</span>
<a name="384" /><span class="True">     384:</span> <span class="k">     */</span>
<a name="385" /><span class="True">     385:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">subsys</span><span class="f">[</span><span class="b">CGROUP_SUBSYS_COUNT</span><span class="f">]</span><span class="f">;</span>
<a name="386" /><span class="True">     386:</span> 
<a name="387" /><span class="True">     387:</span>     <span class="k">/* For RCU-protected deletion */</span>
<a name="388" /><span class="True">     388:</span>     <span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a><span class="f">;</span>
<a name="389" /><span class="True">     389:</span> <span class="f">}</span><span class="f">;</span>
<a name="390" /><span class="True">     390:</span> 
<a name="391" /><span class="True">     391:</span> <span class="k">/*</span>
<a name="392" /><span class="True">     392:</span> <span class="k"> * cgroup_map_cb is an abstract callback API for reporting map-valued</span>
<a name="393" /><span class="True">     393:</span> <span class="k"> * control files</span>
<a name="394" /><span class="True">     394:</span> <span class="k"> */</span>
<a name="395" /><span class="True">     395:</span> 
<a name="396" /><span class="True">     396:</span> <span class="m">struct</span> <span class="b">cgroup_map_cb</span> <span class="f">{</span>
<a name="397" /><span class="True">     397:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fill</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_map_cb</span> <span class="f">*</span><span class="b">cb</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">key</span><span class="f">,</span> <span class="b">u64</span> <span class="b">value</span><span class="f">)</span><span class="f">;</span>
<a name="398" /><span class="True">     398:</span>     <span class="m">void</span> <span class="f">*</span><span class="b">state</span><span class="f">;</span>
<a name="399" /><span class="True">     399:</span> <span class="f">}</span><span class="f">;</span>
<a name="400" /><span class="True">     400:</span> 
<a name="401" /><span class="True">     401:</span> <span class="k">/*</span>
<a name="402" /><span class="True">     402:</span> <span class="k"> * struct cftype: handler definitions for cgroup control files</span>
<a name="403" /><span class="True">     403:</span> <span class="k"> *</span>
<a name="404" /><span class="True">     404:</span> <span class="k"> * When reading/writing to a file:</span>
<a name="405" /><span class="True">     405:</span> <span class="k"> *    - the cgroup to use is file-&gt;f_dentry-&gt;d_parent-&gt;d_fsdata</span>
<a name="406" /><span class="True">     406:</span> <span class="k"> *    - the &apos;cftype&apos; of the file is file-&gt;f_dentry-&gt;d_fsdata</span>
<a name="407" /><span class="True">     407:</span> <span class="k"> */</span>
<a name="408" /><span class="True">     408:</span> 
<a name="409" /><span class="True">     409:</span> <span class="k">/* cftype-&gt;flags */</span>
<a name="410" /><span class="True">     410:</span> <span class="m">enum</span> <span class="f">{</span>
<a name="411" /><span class="True">     411:</span>     <span class="b">CFTYPE_ONLY_ON_ROOT</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">,</span>    <span class="k">/* only create on root cgrp */</span>
<a name="412" /><span class="True">     412:</span>     <span class="b">CFTYPE_NOT_ON_ROOT</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">1</span><span class="f">)</span><span class="f">,</span>    <span class="k">/* don&apos;t create on root cgrp */</span>
<a name="413" /><span class="True">     413:</span>     <span class="b">CFTYPE_INSANE</span>        <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">2</span><span class="f">)</span><span class="f">,</span>    <span class="k">/* don&apos;t create if sane_behavior */</span>
<a name="414" /><span class="True">     414:</span>     <span class="b">CFTYPE_NO_PREFIX</span>    <span class="f">=</span> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">3</span><span class="f">)</span><span class="f">,</span>    <span class="k">/* (DON&apos;T USE FOR NEW FILES) no subsys prefix */</span>
<a name="415" /><span class="True">     415:</span> <span class="f">}</span><span class="f">;</span>
<a name="416" /><span class="True">     416:</span> 
<a name="417" /><span class="True">     417:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX0NGVFlQRV9OQU1FXzA_"><span class="b">MAX_CFTYPE_NAME</span></a>        <span class="c">64</span>
<a name="418" /><span class="True">     418:</span> 
<a name="419" /><span class="True">     419:</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">{</span>
<a name="420" /><span class="True">     420:</span>     <span class="k">/*</span>
<a name="421" /><span class="True">     421:</span> <span class="k">     * By convention, the name should begin with the name of the</span>
<a name="422" /><span class="True">     422:</span> <span class="k">     * subsystem, followed by a period.  Zero length string indicates</span>
<a name="423" /><span class="True">     423:</span> <span class="k">     * end of cftype array.</span>
<a name="424" /><span class="True">     424:</span> <span class="k">     */</span>
<a name="425" /><span class="True">     425:</span>     <span class="m">char</span> <span class="b">name</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX0NGVFlQRV9OQU1FXzA_"><span class="b">MAX_CFTYPE_NAME</span></a><span class="f">]</span><span class="f">;</span>
<a name="426" /><span class="True">     426:</span>     <span class="m">int</span> <span class="m">private</span><span class="f">;</span>
<a name="427" /><span class="True">     427:</span>     <span class="k">/*</span>
<a name="428" /><span class="True">     428:</span> <span class="k">     * If not 0, file mode is set to this value, otherwise it will</span>
<a name="429" /><span class="True">     429:</span> <span class="k">     * be figured out automatically</span>
<a name="430" /><span class="True">     430:</span> <span class="k">     */</span>
<a name="431" /><span class="True">     431:</span>     <span class="b">umode_t</span> <span class="b">mode</span><span class="f">;</span>
<a name="432" /><span class="True">     432:</span> 
<a name="433" /><span class="True">     433:</span>     <span class="k">/*</span>
<a name="434" /><span class="True">     434:</span> <span class="k">     * If non-zero, defines the maximum length of string that can</span>
<a name="435" /><span class="True">     435:</span> <span class="k">     * be passed to write_string; defaults to 64</span>
<a name="436" /><span class="True">     436:</span> <span class="k">     */</span>
<a name="437" /><span class="True">     437:</span>     <span class="b">size_t</span> <span class="b">max_write_len</span><span class="f">;</span>
<a name="438" /><span class="True">     438:</span> 
<a name="439" /><span class="True">     439:</span>     <span class="k">/* CFTYPE_* flags */</span>
<a name="440" /><span class="True">     440:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">flags</span><span class="f">;</span>
<a name="441" /><span class="True">     441:</span> 
<a name="442" /><span class="True">     442:</span>     <span class="k">/*</span>
<a name="443" /><span class="True">     443:</span> <span class="k">     * The subsys this file belongs to.  Initialized automatically</span>
<a name="444" /><span class="True">     444:</span> <span class="k">     * during registration.  NULL for cgroup core files.</span>
<a name="445" /><span class="True">     445:</span> <span class="k">     */</span>
<a name="446" /><span class="True">     446:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">;</span>
<a name="447" /><span class="True">     447:</span> 
<a name="448" /><span class="True">     448:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">open</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">inode</span> <span class="f">*</span><span class="b">inode</span><span class="f">,</span> <span class="m">struct</span> <span class="b">file</span> <span class="f">*</span><span class="b">file</span><span class="f">)</span><span class="f">;</span>
<a name="449" /><span class="True">     449:</span>     <span class="b">ssize_t</span> <span class="f">(</span><span class="f">*</span><span class="b">read</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="450" /><span class="True">     450:</span>             <span class="m">struct</span> <span class="b">file</span> <span class="f">*</span><span class="b">file</span><span class="f">,</span>
<a name="451" /><span class="True">     451:</span>             <span class="m">char</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">buf</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">nbytes</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="b">ppos</span><span class="f">)</span><span class="f">;</span>
<a name="452" /><span class="True">     452:</span>     <span class="k">/*</span>
<a name="453" /><span class="True">     453:</span> <span class="k">     * read_u64() is a shortcut for the common case of returning a</span>
<a name="454" /><span class="True">     454:</span> <span class="k">     * single integer. Use it in place of read()</span>
<a name="455" /><span class="True">     455:</span> <span class="k">     */</span>
<a name="456" /><span class="True">     456:</span>     <span class="b">u64</span> <span class="f">(</span><span class="f">*</span><span class="b">read_u64</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">)</span><span class="f">;</span>
<a name="457" /><span class="True">     457:</span>     <span class="k">/*</span>
<a name="458" /><span class="True">     458:</span> <span class="k">     * read_s64() is a signed version of read_u64()</span>
<a name="459" /><span class="True">     459:</span> <span class="k">     */</span>
<a name="460" /><span class="True">     460:</span>     <span class="b">s64</span> <span class="f">(</span><span class="f">*</span><span class="b">read_s64</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">)</span><span class="f">;</span>
<a name="461" /><span class="True">     461:</span>     <span class="k">/*</span>
<a name="462" /><span class="True">     462:</span> <span class="k">     * read_map() is used for defining a map of key/value</span>
<a name="463" /><span class="True">     463:</span> <span class="k">     * pairs. It should call cb-&gt;fill(cb, key, value) for each</span>
<a name="464" /><span class="True">     464:</span> <span class="k">     * entry. The key/value pairs (and their ordering) should not</span>
<a name="465" /><span class="True">     465:</span> <span class="k">     * change between reboots.</span>
<a name="466" /><span class="True">     466:</span> <span class="k">     */</span>
<a name="467" /><span class="True">     467:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">read_map</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="468" /><span class="True">     468:</span>             <span class="m">struct</span> <span class="b">cgroup_map_cb</span> <span class="f">*</span><span class="b">cb</span><span class="f">)</span><span class="f">;</span>
<a name="469" /><span class="True">     469:</span>     <span class="k">/*</span>
<a name="470" /><span class="True">     470:</span> <span class="k">     * read_seq_string() is used for outputting a simple sequence</span>
<a name="471" /><span class="True">     471:</span> <span class="k">     * using seqfile.</span>
<a name="472" /><span class="True">     472:</span> <span class="k">     */</span>
<a name="473" /><span class="True">     473:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">read_seq_string</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="474" /><span class="True">     474:</span>                    <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span> <span class="m">struct</span> <span class="b">seq_file</span> <span class="f">*</span><span class="b">m</span><span class="f">)</span><span class="f">;</span>
<a name="475" /><span class="True">     475:</span> 
<a name="476" /><span class="True">     476:</span>     <span class="b">ssize_t</span> <span class="f">(</span><span class="f">*</span><span class="b">write</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="477" /><span class="True">     477:</span>              <span class="m">struct</span> <span class="b">file</span> <span class="f">*</span><span class="b">file</span><span class="f">,</span>
<a name="478" /><span class="True">     478:</span>              <span class="m">const</span> <span class="m">char</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">buf</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">nbytes</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="b">ppos</span><span class="f">)</span><span class="f">;</span>
<a name="479" /><span class="True">     479:</span> 
<a name="480" /><span class="True">     480:</span>     <span class="k">/*</span>
<a name="481" /><span class="True">     481:</span> <span class="k">     * write_u64() is a shortcut for the common case of accepting</span>
<a name="482" /><span class="True">     482:</span> <span class="k">     * a single integer (as parsed by simple_strtoull) from</span>
<a name="483" /><span class="True">     483:</span> <span class="k">     * userspace. Use in place of write(); return 0 or error.</span>
<a name="484" /><span class="True">     484:</span> <span class="k">     */</span>
<a name="485" /><span class="True">     485:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">write_u64</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="486" /><span class="True">     486:</span>              <span class="b">u64</span> <span class="b">val</span><span class="f">)</span><span class="f">;</span>
<a name="487" /><span class="True">     487:</span>     <span class="k">/*</span>
<a name="488" /><span class="True">     488:</span> <span class="k">     * write_s64() is a signed version of write_u64()</span>
<a name="489" /><span class="True">     489:</span> <span class="k">     */</span>
<a name="490" /><span class="True">     490:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">write_s64</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="491" /><span class="True">     491:</span>              <span class="b">s64</span> <span class="b">val</span><span class="f">)</span><span class="f">;</span>
<a name="492" /><span class="True">     492:</span> 
<a name="493" /><span class="True">     493:</span>     <span class="k">/*</span>
<a name="494" /><span class="True">     494:</span> <span class="k">     * write_string() is passed a nul-terminated kernelspace</span>
<a name="495" /><span class="True">     495:</span> <span class="k">     * buffer of maximum length determined by max_write_len.</span>
<a name="496" /><span class="True">     496:</span> <span class="k">     * Returns 0 or -ve error code.</span>
<a name="497" /><span class="True">     497:</span> <span class="k">     */</span>
<a name="498" /><span class="True">     498:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">write_string</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="499" /><span class="True">     499:</span>                 <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">buffer</span><span class="f">)</span><span class="f">;</span>
<a name="500" /><span class="True">     500:</span>     <span class="k">/*</span>
<a name="501" /><span class="True">     501:</span> <span class="k">     * trigger() callback can be used to get some kick from the</span>
<a name="502" /><span class="True">     502:</span> <span class="k">     * userspace, when the actual string written is not important</span>
<a name="503" /><span class="True">     503:</span> <span class="k">     * at all. The private field can be used to determine the</span>
<a name="504" /><span class="True">     504:</span> <span class="k">     * kick type for multiplexing.</span>
<a name="505" /><span class="True">     505:</span> <span class="k">     */</span>
<a name="506" /><span class="True">     506:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">trigger</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">event</span><span class="f">)</span><span class="f">;</span>
<a name="507" /><span class="True">     507:</span> 
<a name="508" /><span class="True">     508:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">release</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">inode</span> <span class="f">*</span><span class="b">inode</span><span class="f">,</span> <span class="m">struct</span> <span class="b">file</span> <span class="f">*</span><span class="b">file</span><span class="f">)</span><span class="f">;</span>
<a name="509" /><span class="True">     509:</span> 
<a name="510" /><span class="True">     510:</span>     <span class="k">/*</span>
<a name="511" /><span class="True">     511:</span> <span class="k">     * register_event() callback will be used to add new userspace</span>
<a name="512" /><span class="True">     512:</span> <span class="k">     * waiter for changes related to the cftype. Implement it if</span>
<a name="513" /><span class="True">     513:</span> <span class="k">     * you want to provide this functionality. Use eventfd_signal()</span>
<a name="514" /><span class="True">     514:</span> <span class="k">     * on eventfd to send notification to userspace.</span>
<a name="515" /><span class="True">     515:</span> <span class="k">     */</span>
<a name="516" /><span class="True">     516:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">register_event</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="517" /><span class="True">     517:</span>                   <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span> <span class="m">struct</span> <span class="b">eventfd_ctx</span> <span class="f">*</span><span class="b">eventfd</span><span class="f">,</span>
<a name="518" /><span class="True">     518:</span>                   <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">args</span><span class="f">)</span><span class="f">;</span>
<a name="519" /><span class="True">     519:</span>     <span class="k">/*</span>
<a name="520" /><span class="True">     520:</span> <span class="k">     * unregister_event() callback will be called when userspace</span>
<a name="521" /><span class="True">     521:</span> <span class="k">     * closes the eventfd or on cgroup removing.</span>
<a name="522" /><span class="True">     522:</span> <span class="k">     * This callback must be implemented, if you want provide</span>
<a name="523" /><span class="True">     523:</span> <span class="k">     * notification functionality.</span>
<a name="524" /><span class="True">     524:</span> <span class="k">     */</span>
<a name="525" /><span class="True">     525:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">unregister_event</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="526" /><span class="True">     526:</span>                  <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cft</span><span class="f">,</span>
<a name="527" /><span class="True">     527:</span>                  <span class="m">struct</span> <span class="b">eventfd_ctx</span> <span class="f">*</span><span class="b">eventfd</span><span class="f">)</span><span class="f">;</span>
<a name="528" /><span class="True">     528:</span> <span class="f">}</span><span class="f">;</span>
<a name="529" /><span class="True">     529:</span> 
<a name="530" /><span class="True">     530:</span> <span class="k">/*</span>
<a name="531" /><span class="True">     531:</span> <span class="k"> * cftype_sets describe cftypes belonging to a subsystem and are chained at</span>
<a name="532" /><span class="True">     532:</span> <span class="k"> * cgroup_subsys-&gt;cftsets.  Each cftset points to an array of cftypes</span>
<a name="533" /><span class="True">     533:</span> <span class="k"> * terminated by zero length name.</span>
<a name="534" /><span class="True">     534:</span> <span class="k"> */</span>
<a name="535" /><span class="True">     535:</span> <span class="m">struct</span> <span class="b">cftype_set</span> <span class="f">{</span>
<a name="536" /><span class="True">     536:</span>     <span class="m">struct</span> <span class="b">list_head</span>        <span class="b">node</span><span class="f">;</span>    <span class="k">/* chained at subsys-&gt;cftsets */</span>
<a name="537" /><span class="True">     537:</span>     <span class="m">struct</span> <span class="b">cftype</span>            <span class="f">*</span><span class="b">cfts</span><span class="f">;</span>
<a name="538" /><span class="True">     538:</span> <span class="f">}</span><span class="f">;</span>
<a name="539" /><span class="True">     539:</span> 
<a name="540" /><span class="True">     540:</span> <span class="k">/*</span>
<a name="541" /><span class="True">     541:</span> <span class="k"> * See the comment above CGRP_ROOT_SANE_BEHAVIOR for details.  This</span>
<a name="542" /><span class="True">     542:</span> <span class="k"> * function can be called as long as @cgrp is accessible.</span>
<a name="543" /><span class="True">     543:</span> <span class="k"> */</span>
<a name="544" /><span class="True">     544:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">cgroup_sane_behavior</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgrp</span><span class="f">)</span>
<a name="545" /><span class="True">     545:</span> <span class="f">{</span>
<a name="546" /><span class="True">     546:</span>     <span class="m">return</span> <span class="b">cgrp</span><span class="f">-&gt;</span><span class="b">root</span><span class="f">-&gt;</span><span class="b">flags</span> <span class="f">&amp;</span> <span class="b">CGRP_ROOT_SANE_BEHAVIOR</span><span class="f">;</span>
<a name="547" /><span class="True">     547:</span> <span class="f">}</span>
<a name="548" /><span class="True">     548:</span> 
<a name="549" /><span class="True">     549:</span> <span class="k">/* Caller should hold rcu_read_lock() */</span>
<a name="550" /><span class="True">     550:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">cgroup_name</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgrp</span><span class="f">)</span>
<a name="551" /><span class="True">     551:</span> <span class="f">{</span>
<a name="552" /><span class="True">     552:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_cmN1X2RlcmVmZXJlbmNlXzA_"><span class="b">rcu_dereference</span></a><span class="f">(</span><span class="b">cgrp</span><span class="f">-&gt;</span><span class="b">name</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">name</span><span class="f">;</span>
<a name="553" /><span class="True">     553:</span> <span class="f">}</span>
<a name="554" /><span class="True">     554:</span> 
<a name="555" /><span class="True">     555:</span> <span class="m">int</span> <span class="b">cgroup_add_cftypes</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cfts</span><span class="f">)</span><span class="f">;</span>
<a name="556" /><span class="True">     556:</span> <span class="m">int</span> <span class="b">cgroup_rm_cftypes</span><span class="f">(</span><span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">cfts</span><span class="f">)</span><span class="f">;</span>
<a name="557" /><span class="True">     557:</span> 
<a name="558" /><span class="True">     558:</span> <span class="m">bool</span> <span class="b">cgroup_is_descendant</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgrp</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">ancestor</span><span class="f">)</span><span class="f">;</span>
<a name="559" /><span class="True">     559:</span> 
<a name="560" /><span class="True">     560:</span> <span class="m">int</span> <span class="b">cgroup_path</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgrp</span><span class="f">,</span> <span class="m">char</span> <span class="f">*</span><span class="b">buf</span><span class="f">,</span> <span class="m">int</span> <span class="b">buflen</span><span class="f">)</span><span class="f">;</span>
<a name="561" /><span class="True">     561:</span> <span class="m">int</span> <span class="b">task_cgroup_path</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span> <span class="m">char</span> <span class="f">*</span><span class="b">buf</span><span class="f">,</span> <span class="b">size_t</span> <span class="b">buflen</span><span class="f">)</span><span class="f">;</span>
<a name="562" /><span class="True">     562:</span> 
<a name="563" /><span class="True">     563:</span> <span class="m">int</span> <span class="b">cgroup_task_count</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">cgrp</span><span class="f">)</span><span class="f">;</span>
<a name="564" /><span class="True">     564:</span> 
<a name="565" /><span class="True">     565:</span> <span class="k">/*</span>
<a name="566" /><span class="True">     566:</span> <span class="k"> * Control Group taskset, used to pass around set of tasks to cgroup_subsys</span>
<a name="567" /><span class="True">     567:</span> <span class="k"> * methods.</span>
<a name="568" /><span class="True">     568:</span> <span class="k"> */</span>
<a name="569" /><span class="True">     569:</span> <span class="m">struct</span> <span class="b">cgroup_taskset</span><span class="f">;</span>
<a name="570" /><span class="True">     570:</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">cgroup_taskset_first</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="571" /><span class="True">     571:</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">cgroup_taskset_next</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="572" /><span class="True">     572:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">cgroup_taskset_cur_css</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">,</span>
<a name="573" /><span class="True">     573:</span>                            <span class="m">int</span> <span class="b">subsys_id</span><span class="f">)</span><span class="f">;</span>
<a name="574" /><span class="True">     574:</span> <span class="m">int</span> <span class="b">cgroup_taskset_size</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="575" /><span class="True">     575:</span> 
<a name="576" /><span class="True">     576:</span> <span class="k">/**</span>
<a name="577" /><span class="True">     577:</span> <span class="k"> * cgroup_taskset_for_each - iterate cgroup_taskset</span>
<a name="578" /><span class="True">     578:</span> <span class="k"> * @task: the loop cursor</span>
<a name="579" /><span class="True">     579:</span> <span class="k"> * @skip_css: skip if task&apos;s css matches this, %NULL to iterate through all</span>
<a name="580" /><span class="True">     580:</span> <span class="k"> * @tset: taskset to iterate</span>
<a name="581" /><span class="True">     581:</span> <span class="k"> */</span>
<a name="582" /><span class="True">     582:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y2dyb3VwX3Rhc2tzZXRfZm9yX2VhY2hfMA__"><span class="b">cgroup_taskset_for_each</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">skip_css</span><span class="f">,</span> <span class="b">tset</span><span class="f">)</span>            \
<a name="583" /><span class="True">     583:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">task</span><span class="f">)</span> <span class="f">=</span> <span class="b">cgroup_taskset_first</span><span class="f">(</span><span class="f">(</span><span class="b">tset</span><span class="f">)</span><span class="f">)</span><span class="f">;</span> <span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">;</span>        \
<a name="584" /><span class="True">     584:</span>          <span class="f">(</span><span class="b">task</span><span class="f">)</span> <span class="f">=</span> <span class="b">cgroup_taskset_next</span><span class="f">(</span><span class="f">(</span><span class="b">tset</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>            \
<a name="585" /><span class="True">     585:</span>         <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="f">(</span><span class="b">skip_css</span><span class="f">)</span> <span class="f">||</span>                    \
<a name="586" /><span class="True">     586:</span>             <span class="b">cgroup_taskset_cur_css</span><span class="f">(</span><span class="f">(</span><span class="b">tset</span><span class="f">)</span><span class="f">,</span>            \
<a name="587" /><span class="True">     587:</span>             <span class="f">(</span><span class="b">skip_css</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">ss</span><span class="f">-&gt;</span><span class="b">subsys_id</span><span class="f">)</span> <span class="f">!=</span> <span class="f">(</span><span class="b">skip_css</span><span class="f">)</span><span class="f">)</span>
<a name="588" /><span class="True">     588:</span> 
<a name="589" /><span class="True">     589:</span> <span class="k">/*</span>
<a name="590" /><span class="True">     590:</span> <span class="k"> * Control Group subsystem type.</span>
<a name="591" /><span class="True">     591:</span> <span class="k"> * See Documentation/cgroups/cgroups.txt for details</span>
<a name="592" /><span class="True">     592:</span> <span class="k"> */</span>
<a name="593" /><span class="True">     593:</span> 
<a name="594" /><span class="True">     594:</span> <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">{</span>
<a name="595" /><span class="True">     595:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="f">(</span><span class="f">*</span><span class="b">css_alloc</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">parent_css</span><span class="f">)</span><span class="f">;</span>
<a name="596" /><span class="True">     596:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">css_online</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span><span class="f">;</span>
<a name="597" /><span class="True">     597:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">css_offline</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span><span class="f">;</span>
<a name="598" /><span class="True">     598:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">css_free</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span><span class="f">;</span>
<a name="599" /><span class="True">     599:</span> 
<a name="600" /><span class="True">     600:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">can_attach</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="601" /><span class="True">     601:</span>               <span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="602" /><span class="True">     602:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">cancel_attach</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="603" /><span class="True">     603:</span>                   <span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="604" /><span class="True">     604:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">attach</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="605" /><span class="True">     605:</span>                <span class="m">struct</span> <span class="b">cgroup_taskset</span> <span class="f">*</span><span class="b">tset</span><span class="f">)</span><span class="f">;</span>
<a name="606" /><span class="True">     606:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">fork</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">)</span><span class="f">;</span>
<a name="607" /><span class="True">     607:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">exit</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="608" /><span class="True">     608:</span>              <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">old_css</span><span class="f">,</span>
<a name="609" /><span class="True">     609:</span>              <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">)</span><span class="f">;</span>
<a name="610" /><span class="True">     610:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">bind</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">root_css</span><span class="f">)</span><span class="f">;</span>
<a name="611" /><span class="True">     611:</span> 
<a name="612" /><span class="True">     612:</span>     <span class="m">int</span> <span class="b">subsys_id</span><span class="f">;</span>
<a name="613" /><span class="True">     613:</span>     <span class="m">int</span> <span class="b">disabled</span><span class="f">;</span>
<a name="614" /><span class="True">     614:</span>     <span class="m">int</span> <span class="b">early_init</span><span class="f">;</span>
<a name="615" /><span class="True">     615:</span> 
<a name="616" /><span class="True">     616:</span>     <span class="k">/*</span>
<a name="617" /><span class="True">     617:</span> <span class="k">     * If %false, this subsystem is properly hierarchical -</span>
<a name="618" /><span class="True">     618:</span> <span class="k">     * configuration, resource accounting and restriction on a parent</span>
<a name="619" /><span class="True">     619:</span> <span class="k">     * cgroup cover those of its children.  If %true, hierarchy support</span>
<a name="620" /><span class="True">     620:</span> <span class="k">     * is broken in some ways - some subsystems ignore hierarchy</span>
<a name="621" /><span class="True">     621:</span> <span class="k">     * completely while others are only implemented half-way.</span>
<a name="622" /><span class="True">     622:</span> <span class="k">     *</span>
<a name="623" /><span class="True">     623:</span> <span class="k">     * It&apos;s now disallowed to create nested cgroups if the subsystem is</span>
<a name="624" /><span class="True">     624:</span> <span class="k">     * broken and cgroup core will emit a warning message on such</span>
<a name="625" /><span class="True">     625:</span> <span class="k">     * cases.  Eventually, all subsystems will be made properly</span>
<a name="626" /><span class="True">     626:</span> <span class="k">     * hierarchical and this will go away.</span>
<a name="627" /><span class="True">     627:</span> <span class="k">     */</span>
<a name="628" /><span class="True">     628:</span>     <span class="m">bool</span> <span class="b">broken_hierarchy</span><span class="f">;</span>
<a name="629" /><span class="True">     629:</span>     <span class="m">bool</span> <span class="b">warned_broken_hierarchy</span><span class="f">;</span>
<a name="630" /><span class="True">     630:</span> 
<a name="631" /><span class="True">     631:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TUFYX0NHUk9VUF9UWVBFX05BTUVMRU5fMA__"><span class="b">MAX_CGROUP_TYPE_NAMELEN</span></a> <span class="c">32</span>
<a name="632" /><span class="True">     632:</span>     <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">;</span>
<a name="633" /><span class="True">     633:</span> 
<a name="634" /><span class="True">     634:</span>     <span class="k">/*</span>
<a name="635" /><span class="True">     635:</span> <span class="k">     * Link to parent, and list entry in parent&apos;s children.</span>
<a name="636" /><span class="True">     636:</span> <span class="k">     * Protected by cgroup_lock()</span>
<a name="637" /><span class="True">     637:</span> <span class="k">     */</span>
<a name="638" /><span class="True">     638:</span>     <span class="m">struct</span> <span class="b">cgroupfs_root</span> <span class="f">*</span><span class="b">root</span><span class="f">;</span>
<a name="639" /><span class="True">     639:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">sibling</span><span class="f">;</span>
<a name="640" /><span class="True">     640:</span> 
<a name="641" /><span class="True">     641:</span>     <span class="k">/* list of cftype_sets */</span>
<a name="642" /><span class="True">     642:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">cftsets</span><span class="f">;</span>
<a name="643" /><span class="True">     643:</span> 
<a name="644" /><span class="True">     644:</span>     <span class="k">/* base cftypes, automatically [de]registered with subsys itself */</span>
<a name="645" /><span class="True">     645:</span>     <span class="m">struct</span> <span class="b">cftype</span> <span class="f">*</span><span class="b">base_cftypes</span><span class="f">;</span>
<a name="646" /><span class="True">     646:</span>     <span class="m">struct</span> <span class="b">cftype_set</span> <span class="b">base_cftset</span><span class="f">;</span>
<a name="647" /><span class="True">     647:</span> 
<a name="648" /><span class="True">     648:</span>     <span class="k">/* should be defined only by modular subsystems */</span>
<a name="649" /><span class="True">     649:</span>     <span class="m">struct</span> <span class="b">module</span> <span class="f">*</span><span class="b">module</span><span class="f">;</span>
<a name="650" /><span class="True">     650:</span> <span class="f">}</span><span class="f">;</span>
<a name="651" /><span class="True">     651:</span> 
<a name="652" /><span class="True">     652:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U1VCU1lTXzE_"><span class="b">SUBSYS</span></a><span class="f">(</span><span class="b">_x</span><span class="f">)</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="b">_x</span> <span class="f">##</span> <span class="b">_subsys</span><span class="f">;</span>
<a name="653" /><span class="True">     653:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_SVNfQlVJTFRJTl8w"><span class="b">IS_BUILTIN</span></a><span class="f">(</span><span class="b">option</span><span class="f">)</span>
<a name="654" /><span class="True">     654:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cgroup_subsys</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="655" /><span class="True">     655:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_SVNfU1VCU1lTX0VOQUJMRURfMg__"><span class="b">IS_SUBSYS_ENABLED</span></a>
<a name="656" /><span class="True">     656:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_U1VCU1lTXzE_"><span class="b">SUBSYS</span></a>
<a name="657" /><span class="True">     657:</span> 
<a name="658" /><span class="True">     658:</span> <span class="k">/**</span>
<a name="659" /><span class="True">     659:</span> <span class="k"> * css_parent - find the parent css</span>
<a name="660" /><span class="True">     660:</span> <span class="k"> * @css: the target cgroup_subsys_state</span>
<a name="661" /><span class="True">     661:</span> <span class="k"> *</span>
<a name="662" /><span class="True">     662:</span> <span class="k"> * Return the parent css of @css.  This function is guaranteed to return</span>
<a name="663" /><span class="True">     663:</span> <span class="k"> * non-NULL parent as long as @css isn&apos;t the root.</span>
<a name="664" /><span class="True">     664:</span> <span class="k"> */</span>
<a name="665" /><span class="True">     665:</span> <span class="m">static</span> <span class="m">inline</span>
<a name="666" /><span class="True">     666:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css_parent</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span>
<a name="667" /><span class="True">     667:</span> <span class="f">{</span>
<a name="668" /><span class="True">     668:</span>     <span class="m">return</span> <span class="b">css</span><span class="f">-&gt;</span><span class="b">parent</span><span class="f">;</span>
<a name="669" /><span class="True">     669:</span> <span class="f">}</span>
<a name="670" /><span class="True">     670:</span> 
<a name="671" /><span class="True">     671:</span> <span class="k">/**</span>
<a name="672" /><span class="True">     672:</span> <span class="k"> * task_css_set_check - obtain a task&apos;s css_set with extra access conditions</span>
<a name="673" /><span class="True">     673:</span> <span class="k"> * @task: the task to obtain css_set for</span>
<a name="674" /><span class="True">     674:</span> <span class="k"> * @__c: extra condition expression to be passed to rcu_dereference_check()</span>
<a name="675" /><span class="True">     675:</span> <span class="k"> *</span>
<a name="676" /><span class="True">     676:</span> <span class="k"> * A task&apos;s css_set is RCU protected, initialized and exited while holding</span>
<a name="677" /><span class="True">     677:</span> <span class="k"> * task_lock(), and can only be modified while holding both cgroup_mutex</span>
<a name="678" /><span class="True">     678:</span> <span class="k"> * and task_lock() while the task is alive.  This macro verifies that the</span>
<a name="679" /><span class="True">     679:</span> <span class="k"> * caller is inside proper critical section and returns @task&apos;s css_set.</span>
<a name="680" /><span class="True">     680:</span> <span class="k"> *</span>
<a name="681" /><span class="True">     681:</span> <span class="k"> * The caller can also specify additional allowed conditions via @__c, such</span>
<a name="682" /><span class="True">     682:</span> <span class="k"> * as locks used during the cgroup_subsys::attach() methods.</span>
<a name="683" /><span class="True">     683:</span> <span class="k"> */</span>
<a name="684" /><span class="False">     684:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_PROVE_RCU</span>
<a name="685" /><span class="False">     685:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">mutex</span> <span class="b">cgroup_mutex</span><span class="f">;</span>
<a name="686" /><span class="False">     686:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_dGFza19jc3Nfc2V0X2NoZWNrXzA_"><span class="b">task_css_set_check</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">__c</span><span class="f">)</span>                    \
<a name="687" /><span class="False">     687:</span>     <a href="cpu.c_macros_ref.html#_cmN1X2RlcmVmZXJlbmNlX2NoZWNrXzA_"><span class="b">rcu_dereference_check</span></a><span class="f">(</span><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">cgroups</span><span class="f">,</span>                \
<a name="688" /><span class="False">     688:</span>         <span class="b">lockdep_is_held</span><span class="f">(</span><span class="f">&amp;</span><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">alloc_lock</span><span class="f">)</span> <span class="f">||</span>            \
<a name="689" /><span class="False">     689:</span>         <span class="b">lockdep_is_held</span><span class="f">(</span><span class="f">&amp;</span><span class="b">cgroup_mutex</span><span class="f">)</span> <span class="f">||</span> <span class="f">(</span><span class="b">__c</span><span class="f">)</span><span class="f">)</span>
<a name="690" /><span class="True">     690:</span> <span class="f">#</span><span class="n">else</span>
<a name="691" /><span class="True">     691:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_dGFza19jc3Nfc2V0X2NoZWNrXzA_"><span class="b">task_css_set_check</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">__c</span><span class="f">)</span>                    \
<a name="692" /><span class="True">     692:</span>     <a href="cpu.c_macros_ref.html#_cmN1X2RlcmVmZXJlbmNlXzA_"><span class="b">rcu_dereference</span></a><span class="f">(</span><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">cgroups</span><span class="f">)</span>
<a name="693" /><span class="True">     693:</span> <span class="f">#</span><span class="n">endif</span>
<a name="694" /><span class="True">     694:</span> 
<a name="695" /><span class="True">     695:</span> <span class="k">/**</span>
<a name="696" /><span class="True">     696:</span> <span class="k"> * task_css_check - obtain css for (task, subsys) w/ extra access conds</span>
<a name="697" /><span class="True">     697:</span> <span class="k"> * @task: the target task</span>
<a name="698" /><span class="True">     698:</span> <span class="k"> * @subsys_id: the target subsystem ID</span>
<a name="699" /><span class="True">     699:</span> <span class="k"> * @__c: extra condition expression to be passed to rcu_dereference_check()</span>
<a name="700" /><span class="True">     700:</span> <span class="k"> *</span>
<a name="701" /><span class="True">     701:</span> <span class="k"> * Return the cgroup_subsys_state for the (@task, @subsys_id) pair.  The</span>
<a name="702" /><span class="True">     702:</span> <span class="k"> * synchronization rules are the same as task_css_set_check().</span>
<a name="703" /><span class="True">     703:</span> <span class="k"> */</span>
<a name="704" /><span class="True">     704:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_dGFza19jc3NfY2hlY2tfMA__"><span class="b">task_css_check</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">subsys_id</span><span class="f">,</span> <span class="b">__c</span><span class="f">)</span>                \
<a name="705" /><span class="True">     705:</span>     <a href="cpu.c_macros_ref.html#_dGFza19jc3Nfc2V0X2NoZWNrXzA_"><span class="b">task_css_set_check</span></a><span class="f">(</span><span class="f">(</span><span class="b">task</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">__c</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">subsys</span><span class="f">[</span><span class="f">(</span><span class="b">subsys_id</span><span class="f">)</span><span class="f">]</span>
<a name="706" /><span class="True">     706:</span> 
<a name="707" /><span class="True">     707:</span> <span class="k">/**</span>
<a name="708" /><span class="True">     708:</span> <span class="k"> * task_css_set - obtain a task&apos;s css_set</span>
<a name="709" /><span class="True">     709:</span> <span class="k"> * @task: the task to obtain css_set for</span>
<a name="710" /><span class="True">     710:</span> <span class="k"> *</span>
<a name="711" /><span class="True">     711:</span> <span class="k"> * See task_css_set_check().</span>
<a name="712" /><span class="True">     712:</span> <span class="k"> */</span>
<a name="713" /><span class="True">     713:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">css_set</span> <span class="f">*</span><span class="b">task_css_set</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">)</span>
<a name="714" /><span class="True">     714:</span> <span class="f">{</span>
<a name="715" /><span class="True">     715:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGFza19jc3Nfc2V0X2NoZWNrXzA_"><span class="b">task_css_set_check</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="m">false</span><span class="f">)</span><span class="f">;</span>
<a name="716" /><span class="True">     716:</span> <span class="f">}</span>
<a name="717" /><span class="True">     717:</span> 
<a name="718" /><span class="True">     718:</span> <span class="k">/**</span>
<a name="719" /><span class="True">     719:</span> <span class="k"> * task_css - obtain css for (task, subsys)</span>
<a name="720" /><span class="True">     720:</span> <span class="k"> * @task: the target task</span>
<a name="721" /><span class="True">     721:</span> <span class="k"> * @subsys_id: the target subsystem ID</span>
<a name="722" /><span class="True">     722:</span> <span class="k"> *</span>
<a name="723" /><span class="True">     723:</span> <span class="k"> * See task_css_check().</span>
<a name="724" /><span class="True">     724:</span> <span class="k"> */</span>
<a name="725" /><span class="True">     725:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">task_css</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span>
<a name="726" /><span class="True">     726:</span>                            <span class="m">int</span> <span class="b">subsys_id</span><span class="f">)</span>
<a name="727" /><span class="True">     727:</span> <span class="f">{</span>
<a name="728" /><span class="True">     728:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGFza19jc3NfY2hlY2tfMA__"><span class="b">task_css_check</span></a><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">subsys_id</span><span class="f">,</span> <span class="m">false</span><span class="f">)</span><span class="f">;</span>
<a name="729" /><span class="True">     729:</span> <span class="f">}</span>
<a name="730" /><span class="True">     730:</span> 
<a name="731" /><span class="True">     731:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">task_cgroup</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">task</span><span class="f">,</span>
<a name="732" /><span class="True">     732:</span>                      <span class="m">int</span> <span class="b">subsys_id</span><span class="f">)</span>
<a name="733" /><span class="True">     733:</span> <span class="f">{</span>
<a name="734" /><span class="True">     734:</span>     <span class="m">return</span> <span class="b">task_css</span><span class="f">(</span><span class="b">task</span><span class="f">,</span> <span class="b">subsys_id</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">cgroup</span><span class="f">;</span>
<a name="735" /><span class="True">     735:</span> <span class="f">}</span>
<a name="736" /><span class="True">     736:</span> 
<a name="737" /><span class="True">     737:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css_next_child</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">pos</span><span class="f">,</span>
<a name="738" /><span class="True">     738:</span>                        <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">parent</span><span class="f">)</span><span class="f">;</span>
<a name="739" /><span class="True">     739:</span> 
<a name="740" /><span class="True">     740:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css_from_id</span><span class="f">(</span><span class="m">int</span> <span class="b">id</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">)</span><span class="f">;</span>
<a name="741" /><span class="True">     741:</span> 
<a name="742" /><span class="True">     742:</span> <span class="k">/**</span>
<a name="743" /><span class="True">     743:</span> <span class="k"> * css_for_each_child - iterate through children of a css</span>
<a name="744" /><span class="True">     744:</span> <span class="k"> * @pos: the css * to use as the loop cursor</span>
<a name="745" /><span class="True">     745:</span> <span class="k"> * @parent: css whose children to walk</span>
<a name="746" /><span class="True">     746:</span> <span class="k"> *</span>
<a name="747" /><span class="True">     747:</span> <span class="k"> * Walk @parent&apos;s children.  Must be called under rcu_read_lock().  A child</span>
<a name="748" /><span class="True">     748:</span> <span class="k"> * css which hasn&apos;t finished -&gt;css_online() or already has finished</span>
<a name="749" /><span class="True">     749:</span> <span class="k"> * -&gt;css_offline() may show up during traversal and it&apos;s each subsystem&apos;s</span>
<a name="750" /><span class="True">     750:</span> <span class="k"> * responsibility to verify that each @pos is alive.</span>
<a name="751" /><span class="True">     751:</span> <span class="k"> *</span>
<a name="752" /><span class="True">     752:</span> <span class="k"> * If a subsystem synchronizes against the parent in its -&gt;css_online() and</span>
<a name="753" /><span class="True">     753:</span> <span class="k"> * before starting iterating, a css which finished -&gt;css_online() is</span>
<a name="754" /><span class="True">     754:</span> <span class="k"> * guaranteed to be visible in the future iterations.</span>
<a name="755" /><span class="True">     755:</span> <span class="k"> *</span>
<a name="756" /><span class="True">     756:</span> <span class="k"> * It is allowed to temporarily drop RCU read lock during iteration.  The</span>
<a name="757" /><span class="True">     757:</span> <span class="k"> * caller is responsible for ensuring that @pos remains accessible until</span>
<a name="758" /><span class="True">     758:</span> <span class="k"> * the start of the next iteration by, for example, bumping the css refcnt.</span>
<a name="759" /><span class="True">     759:</span> <span class="k"> */</span>
<a name="760" /><span class="True">     760:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y3NzX2Zvcl9lYWNoX2NoaWxkXzA_"><span class="b">css_for_each_child</span></a><span class="f">(</span><span class="b">pos</span><span class="f">,</span> <span class="b">parent</span><span class="f">)</span>                    \
<a name="761" /><span class="True">     761:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_child</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">,</span> <span class="f">(</span><span class="b">parent</span><span class="f">)</span><span class="f">)</span><span class="f">;</span> <span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">;</span>        \
<a name="762" /><span class="True">     762:</span>          <span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_child</span><span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">parent</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="763" /><span class="True">     763:</span> 
<a name="764" /><span class="True">     764:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span>
<a name="765" /><span class="True">     765:</span> <span class="b">css_next_descendant_pre</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">pos</span><span class="f">,</span>
<a name="766" /><span class="True">     766:</span>             <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span><span class="f">;</span>
<a name="767" /><span class="True">     767:</span> 
<a name="768" /><span class="True">     768:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span>
<a name="769" /><span class="True">     769:</span> <span class="b">css_rightmost_descendant</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">pos</span><span class="f">)</span><span class="f">;</span>
<a name="770" /><span class="True">     770:</span> 
<a name="771" /><span class="True">     771:</span> <span class="k">/**</span>
<a name="772" /><span class="True">     772:</span> <span class="k"> * css_for_each_descendant_pre - pre-order walk of a css&apos;s descendants</span>
<a name="773" /><span class="True">     773:</span> <span class="k"> * @pos: the css * to use as the loop cursor</span>
<a name="774" /><span class="True">     774:</span> <span class="k"> * @root: css whose descendants to walk</span>
<a name="775" /><span class="True">     775:</span> <span class="k"> *</span>
<a name="776" /><span class="True">     776:</span> <span class="k"> * Walk @root&apos;s descendants.  @root is included in the iteration and the</span>
<a name="777" /><span class="True">     777:</span> <span class="k"> * first node to be visited.  Must be called under rcu_read_lock().  A</span>
<a name="778" /><span class="True">     778:</span> <span class="k"> * descendant css which hasn&apos;t finished -&gt;css_online() or already has</span>
<a name="779" /><span class="True">     779:</span> <span class="k"> * finished -&gt;css_offline() may show up during traversal and it&apos;s each</span>
<a name="780" /><span class="True">     780:</span> <span class="k"> * subsystem&apos;s responsibility to verify that each @pos is alive.</span>
<a name="781" /><span class="True">     781:</span> <span class="k"> *</span>
<a name="782" /><span class="True">     782:</span> <span class="k"> * If a subsystem synchronizes against the parent in its -&gt;css_online() and</span>
<a name="783" /><span class="True">     783:</span> <span class="k"> * before starting iterating, and synchronizes against @pos on each</span>
<a name="784" /><span class="True">     784:</span> <span class="k"> * iteration, any descendant css which finished -&gt;css_online() is</span>
<a name="785" /><span class="True">     785:</span> <span class="k"> * guaranteed to be visible in the future iterations.</span>
<a name="786" /><span class="True">     786:</span> <span class="k"> *</span>
<a name="787" /><span class="True">     787:</span> <span class="k"> * In other words, the following guarantees that a descendant can&apos;t escape</span>
<a name="788" /><span class="True">     788:</span> <span class="k"> * state updates of its ancestors.</span>
<a name="789" /><span class="True">     789:</span> <span class="k"> *</span>
<a name="790" /><span class="True">     790:</span> <span class="k"> * my_online(@css)</span>
<a name="791" /><span class="True">     791:</span> <span class="k"> * {</span>
<a name="792" /><span class="True">     792:</span> <span class="k"> *    Lock @css&apos;s parent and @css;</span>
<a name="793" /><span class="True">     793:</span> <span class="k"> *    Inherit state from the parent;</span>
<a name="794" /><span class="True">     794:</span> <span class="k"> *    Unlock both.</span>
<a name="795" /><span class="True">     795:</span> <span class="k"> * }</span>
<a name="796" /><span class="True">     796:</span> <span class="k"> *</span>
<a name="797" /><span class="True">     797:</span> <span class="k"> * my_update_state(@css)</span>
<a name="798" /><span class="True">     798:</span> <span class="k"> * {</span>
<a name="799" /><span class="True">     799:</span> <span class="k"> *    css_for_each_descendant_pre(@pos, @css) {</span>
<a name="800" /><span class="True">     800:</span> <span class="k"> *        Lock @pos;</span>
<a name="801" /><span class="True">     801:</span> <span class="k"> *        if (@pos == @css)</span>
<a name="802" /><span class="True">     802:</span> <span class="k"> *            Update @css&apos;s state;</span>
<a name="803" /><span class="True">     803:</span> <span class="k"> *        else</span>
<a name="804" /><span class="True">     804:</span> <span class="k"> *            Verify @pos is alive and inherit state from its parent;</span>
<a name="805" /><span class="True">     805:</span> <span class="k"> *        Unlock @pos;</span>
<a name="806" /><span class="True">     806:</span> <span class="k"> *    }</span>
<a name="807" /><span class="True">     807:</span> <span class="k"> * }</span>
<a name="808" /><span class="True">     808:</span> <span class="k"> *</span>
<a name="809" /><span class="True">     809:</span> <span class="k"> * As long as the inheriting step, including checking the parent state, is</span>
<a name="810" /><span class="True">     810:</span> <span class="k"> * enclosed inside @pos locking, double-locking the parent isn&apos;t necessary</span>
<a name="811" /><span class="True">     811:</span> <span class="k"> * while inheriting.  The state update to the parent is guaranteed to be</span>
<a name="812" /><span class="True">     812:</span> <span class="k"> * visible by walking order and, as long as inheriting operations to the</span>
<a name="813" /><span class="True">     813:</span> <span class="k"> * same @pos are atomic to each other, multiple updates racing each other</span>
<a name="814" /><span class="True">     814:</span> <span class="k"> * still result in the correct state.  It&apos;s guaranateed that at least one</span>
<a name="815" /><span class="True">     815:</span> <span class="k"> * inheritance happens for any css after the latest update to its parent.</span>
<a name="816" /><span class="True">     816:</span> <span class="k"> *</span>
<a name="817" /><span class="True">     817:</span> <span class="k"> * If checking parent&apos;s state requires locking the parent, each inheriting</span>
<a name="818" /><span class="True">     818:</span> <span class="k"> * iteration should lock and unlock both @pos-&gt;parent and @pos.</span>
<a name="819" /><span class="True">     819:</span> <span class="k"> *</span>
<a name="820" /><span class="True">     820:</span> <span class="k"> * Alternatively, a subsystem may choose to use a single global lock to</span>
<a name="821" /><span class="True">     821:</span> <span class="k"> * synchronize -&gt;css_online() and -&gt;css_offline() against tree-walking</span>
<a name="822" /><span class="True">     822:</span> <span class="k"> * operations.</span>
<a name="823" /><span class="True">     823:</span> <span class="k"> *</span>
<a name="824" /><span class="True">     824:</span> <span class="k"> * It is allowed to temporarily drop RCU read lock during iteration.  The</span>
<a name="825" /><span class="True">     825:</span> <span class="k"> * caller is responsible for ensuring that @pos remains accessible until</span>
<a name="826" /><span class="True">     826:</span> <span class="k"> * the start of the next iteration by, for example, bumping the css refcnt.</span>
<a name="827" /><span class="True">     827:</span> <span class="k"> */</span>
<a name="828" /><span class="True">     828:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y3NzX2Zvcl9lYWNoX2Rlc2NlbmRhbnRfcHJlXzA_"><span class="b">css_for_each_descendant_pre</span></a><span class="f">(</span><span class="b">pos</span><span class="f">,</span> <span class="b">css</span><span class="f">)</span>                \
<a name="829" /><span class="True">     829:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_descendant_pre</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">,</span> <span class="f">(</span><span class="b">css</span><span class="f">)</span><span class="f">)</span><span class="f">;</span> <span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">;</span>    \
<a name="830" /><span class="True">     830:</span>          <span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_descendant_pre</span><span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">css</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="831" /><span class="True">     831:</span> 
<a name="832" /><span class="True">     832:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span>
<a name="833" /><span class="True">     833:</span> <span class="b">css_next_descendant_post</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">pos</span><span class="f">,</span>
<a name="834" /><span class="True">     834:</span>              <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">)</span><span class="f">;</span>
<a name="835" /><span class="True">     835:</span> 
<a name="836" /><span class="True">     836:</span> <span class="k">/**</span>
<a name="837" /><span class="True">     837:</span> <span class="k"> * css_for_each_descendant_post - post-order walk of a css&apos;s descendants</span>
<a name="838" /><span class="True">     838:</span> <span class="k"> * @pos: the css * to use as the loop cursor</span>
<a name="839" /><span class="True">     839:</span> <span class="k"> * @css: css whose descendants to walk</span>
<a name="840" /><span class="True">     840:</span> <span class="k"> *</span>
<a name="841" /><span class="True">     841:</span> <span class="k"> * Similar to css_for_each_descendant_pre() but performs post-order</span>
<a name="842" /><span class="True">     842:</span> <span class="k"> * traversal instead.  @root is included in the iteration and the last</span>
<a name="843" /><span class="True">     843:</span> <span class="k"> * node to be visited.  Note that the walk visibility guarantee described</span>
<a name="844" /><span class="True">     844:</span> <span class="k"> * in pre-order walk doesn&apos;t apply the same to post-order walks.</span>
<a name="845" /><span class="True">     845:</span> <span class="k"> */</span>
<a name="846" /><span class="True">     846:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y3NzX2Zvcl9lYWNoX2Rlc2NlbmRhbnRfcG9zdF8w"><span class="b">css_for_each_descendant_post</span></a><span class="f">(</span><span class="b">pos</span><span class="f">,</span> <span class="b">css</span><span class="f">)</span>                \
<a name="847" /><span class="True">     847:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_descendant_post</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">,</span> <span class="f">(</span><span class="b">css</span><span class="f">)</span><span class="f">)</span><span class="f">;</span> <span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">;</span>    \
<a name="848" /><span class="True">     848:</span>          <span class="f">(</span><span class="b">pos</span><span class="f">)</span> <span class="f">=</span> <span class="b">css_next_descendant_post</span><span class="f">(</span><span class="f">(</span><span class="b">pos</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">css</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="849" /><span class="True">     849:</span> 
<a name="850" /><span class="True">     850:</span> <span class="k">/* A css_task_iter should be treated as an opaque object */</span>
<a name="851" /><span class="True">     851:</span> <span class="m">struct</span> <span class="b">css_task_iter</span> <span class="f">{</span>
<a name="852" /><span class="True">     852:</span>     <span class="m">struct</span> <span class="b">cgroup_subsys_state</span>    <span class="f">*</span><span class="b">origin_css</span><span class="f">;</span>
<a name="853" /><span class="True">     853:</span>     <span class="m">struct</span> <span class="b">list_head</span>        <span class="f">*</span><span class="b">cset_link</span><span class="f">;</span>
<a name="854" /><span class="True">     854:</span>     <span class="m">struct</span> <span class="b">list_head</span>        <span class="f">*</span><span class="b">task</span><span class="f">;</span>
<a name="855" /><span class="True">     855:</span> <span class="f">}</span><span class="f">;</span>
<a name="856" /><span class="True">     856:</span> 
<a name="857" /><span class="True">     857:</span> <span class="m">void</span> <span class="b">css_task_iter_start</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="858" /><span class="True">     858:</span>              <span class="m">struct</span> <span class="b">css_task_iter</span> <span class="f">*</span><span class="b">it</span><span class="f">)</span><span class="f">;</span>
<a name="859" /><span class="True">     859:</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">css_task_iter_next</span><span class="f">(</span><span class="m">struct</span> <span class="b">css_task_iter</span> <span class="f">*</span><span class="b">it</span><span class="f">)</span><span class="f">;</span>
<a name="860" /><span class="True">     860:</span> <span class="m">void</span> <span class="b">css_task_iter_end</span><span class="f">(</span><span class="m">struct</span> <span class="b">css_task_iter</span> <span class="f">*</span><span class="b">it</span><span class="f">)</span><span class="f">;</span>
<a name="861" /><span class="True">     861:</span> 
<a name="862" /><span class="True">     862:</span> <span class="m">int</span> <span class="b">css_scan_tasks</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css</span><span class="f">,</span>
<a name="863" /><span class="True">     863:</span>            <span class="m">bool</span> <span class="f">(</span><span class="f">*</span><span class="b">test</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span>
<a name="864" /><span class="True">     864:</span>            <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">process</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span>
<a name="865" /><span class="True">     865:</span>            <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span> <span class="m">struct</span> <span class="b">ptr_heap</span> <span class="f">*</span><span class="b">heap</span><span class="f">)</span><span class="f">;</span>
<a name="866" /><span class="True">     866:</span> 
<a name="867" /><span class="True">     867:</span> <span class="m">int</span> <span class="b">cgroup_attach_task_all</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="868" /><span class="True">     868:</span> <span class="m">int</span> <span class="b">cgroup_transfer_tasks</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cgroup</span> <span class="f">*</span><span class="b">from</span><span class="f">)</span><span class="f">;</span>
<a name="869" /><span class="True">     869:</span> 
<a name="870" /><span class="True">     870:</span> <span class="m">struct</span> <span class="b">cgroup_subsys_state</span> <span class="f">*</span><span class="b">css_from_dir</span><span class="f">(</span><span class="m">struct</span> <span class="b">dentry</span> <span class="f">*</span><span class="b">dentry</span><span class="f">,</span>
<a name="871" /><span class="True">     871:</span>                      <span class="m">struct</span> <span class="b">cgroup_subsys</span> <span class="f">*</span><span class="b">ss</span><span class="f">)</span><span class="f">;</span>
<a name="872" /><span class="True">     872:</span> 
<a name="873" /><span class="False">     873:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* !CONFIG_CGROUPS */</span>
<a name="874" /><span class="False">     874:</span> 
<a name="875" /><span class="False">     875:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">cgroup_init_early</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="f">{</span> <span class="m">return</span> <span class="c">0</span><span class="f">;</span> <span class="f">}</span>
<a name="876" /><span class="False">     876:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">cgroup_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="f">{</span> <span class="m">return</span> <span class="c">0</span><span class="f">;</span> <span class="f">}</span>
<a name="877" /><span class="False">     877:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cgroup_fork</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="878" /><span class="False">     878:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cgroup_post_fork</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="879" /><span class="False">     879:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">cgroup_exit</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">p</span><span class="f">,</span> <span class="m">int</span> <span class="b">callbacks</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="880" /><span class="False">     880:</span> 
<a name="881" /><span class="False">     881:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">cgroupstats_build</span><span class="f">(</span><span class="m">struct</span> <span class="b">cgroupstats</span> <span class="f">*</span><span class="b">stats</span><span class="f">,</span>
<a name="882" /><span class="False">     882:</span>                     <span class="m">struct</span> <span class="b">dentry</span> <span class="f">*</span><span class="b">dentry</span><span class="f">)</span>
<a name="883" /><span class="False">     883:</span> <span class="f">{</span>
<a name="884" /><span class="False">     884:</span>     <span class="m">return</span> <span class="f">-</span><a href="cpu.c_macros_ref.html#_RUlOVkFMXzA_"><span class="b">EINVAL</span></a><span class="f">;</span>
<a name="885" /><span class="False">     885:</span> <span class="f">}</span>
<a name="886" /><span class="False">     886:</span> 
<a name="887" /><span class="False">     887:</span> <span class="k">/* No cgroups - nothing to do */</span>
<a name="888" /><span class="False">     888:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">cgroup_attach_task_all</span><span class="f">(</span><span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span>
<a name="889" /><span class="False">     889:</span>                      <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">t</span><span class="f">)</span>
<a name="890" /><span class="False">     890:</span> <span class="f">{</span>
<a name="891" /><span class="False">     891:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="892" /><span class="False">     892:</span> <span class="f">}</span>
<a name="893" /><span class="False">     893:</span> 
<a name="894" /><span class="True">     894:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !CONFIG_CGROUPS */</span>
<a name="895" /><span class="True">     895:</span> 
<a name="896" /><span class="True">     896:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_CGROUP_H */</span>
<a name="897" /><span class="True">     897:</span> </pre>
  </body>
</html>
